#ifndef __TICK__H__
#define __TICK__H__

#include <stdint.h>

#define CALL_BACK_ARRAY_MAX (10)
typedef uint32_t rt_tick_t; /**< Type for tick count */

#ifndef NULL
#define NULL 0
#endif

typedef enum
{
    DISABLE = 0U,
    ENABLE  = !DISABLE
} FunState;

typedef struct
{
    void (*cb)(void);   // 回调函数
    uint32_t  period;   // 周期数量
    FunState  flag;     // 是否启用
    FunState  isRepeat; // 是否周期性重复
    uint32_t  count;    // 计数值
    rt_tick_t last_run_tick;
} CB_HANDLE_STRUCT;

void      rt_tick_init(void);
void      rt_tick_set(rt_tick_t tick);
rt_tick_t rt_tick_get(void);
uint8_t   rt_tick_incream_judge(void);

__attribute__((always_inline)) inline void call_back_task_run(CB_HANDLE_STRUCT *cb)
{
    CB_HANDLE_STRUCT *p = NULL;

    for (int i = 0; i < CALL_BACK_ARRAY_MAX; i++) {
        p = cb + i;
        if ((p->cb) != NULL) {
            if (p->flag) {
                if (p->count + p->period <= rt_tick_get()) {
                    p->count = rt_tick_get();
                    p->cb();
                    if (!(p->isRepeat)) {
                        p->flag = DISABLE;
                    }
                }
            }
        }
        else {
            return;
        }
    }
}
#endif
